	package br.com.vagacerta.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.vagacerta.modelo.Endereco;
import br.com.vagacerta.modelo.TipoEndereco;

@Repository
public class EnderecoDAO {

	private Connection connection;
	private CidadeDAO cidadeDAO;
	
	
	@Autowired
	public EnderecoDAO(DataSource dataSource, CidadeDAO cidadeDAO) {
		try {
			this.connection = dataSource.getConnection();
			this.cidadeDAO = cidadeDAO;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public TipoEndereco consultaTipoEndereco(String tipoEnd) {

		try {

			TipoEndereco tipoEndereco = new TipoEndereco();

			String sql = "SELECT COD_TIPO_ENDERECO, DESC_TIPO_ENDERECO FROM TIPO_ENDERECO WHERE UPPER(DESC_TIPO_ENDERECO) = ? ORDER BY COD_TIPO_ENDERECO ASC LIMIT 1";
			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setString(1, tipoEnd.toUpperCase());

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				tipoEndereco.setCodigoTipoEndereco(rs
						.getLong("COD_TIPO_ENDERECO"));
				tipoEndereco.setDescricaoTipoEndereco(rs
						.getString("DESC_TIPO_ENDERECO"));

			}

			rs.close();
			stmt.close();

			return tipoEndereco;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	public List<TipoEndereco> getListaTipoEndereco() {

		try {
			String sql = "select * from tipo_endereco";

			PreparedStatement stmt = connection.prepareStatement(sql);

			ResultSet rs = stmt.executeQuery();
			List<TipoEndereco> listaTipoEndereco = new ArrayList<TipoEndereco>();

			while (rs.next()) {
				TipoEndereco tipoEndereco = new TipoEndereco();
				tipoEndereco.setCodigoTipoEndereco(rs
						.getLong("COD_TIPO_ENDERECO"));
				tipoEndereco.setDescricaoTipoEndereco(rs
						.getString("DESC_TIPO_ENDERECO"));
				listaTipoEndereco.add(tipoEndereco);

			}

			rs.close();
			stmt.close();

			return listaTipoEndereco;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	protected void insereEnderecoCliente(Endereco endereco, long codigoCliente) {

		try {

			String sql = "INSERT INTO ENDERECO (COD_CLIENTE, COD_CIDADE, COD_TIPO_ENDERECO, "
					+ "NUMERO, LOGRADOURO, COMPLEMENTO, BAIRRO) VALUES (?, ?, ?, ?, ?, ?, ?)";

			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setLong(1, codigoCliente);
			stmt.setLong(2, endereco.getCidade().getCodigoCidade());
			stmt.setLong(3, endereco.getTipoEndereco().getCodigoTipoEndereco());
			stmt.setLong(4, endereco.getNumero());
			stmt.setString(5, endereco.getLogradouro());
			stmt.setString(6, endereco.getComplemento());
			stmt.setString(7, endereco.getBairro());

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	public void excluiEnderecoPorIdCliente(long idCliente) throws SQLException {

		try {

			String sql = "DELETE FROM ENDERECO WHERE COD_CLIENTE = ?";

			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setLong(1, idCliente);

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	public Endereco consultaEnderecoPorIdCliente(long idCliente) {
		try {

			String sql = "SELECT * FROM ENDERECO WHERE COD_CLIENTE = ? LIMIT 1";

			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, idCliente);
			
			ResultSet rs = stmt.executeQuery();
			Endereco endereco = new Endereco();

			while (rs.next()) {
				endereco.setCodigoEndereco(rs.getLong("COD_ENDERECO"));
				endereco.setTipoEndereco(consultaTipoEnderecoPorId(rs.getLong("COD_TIPO_ENDERECO")));
				endereco.setLogradouro(rs.getString("LOGRADOURO"));
				endereco.setNumero(rs.getInt("NUMERO"));
				endereco.setComplemento(rs.getString("COMPLEMENTO"));
				endereco.setBairro(rs.getString("BAIRRO"));
				endereco.setCidade(cidadeDAO.consultaCidadePorId(rs.getLong("COD_CIDADE")));

			}
			
			rs.close();
			stmt.close();

			return endereco;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	private TipoEndereco consultaTipoEnderecoPorId(long idTipoEndereco) {

		try {

			String sql = "SELECT * FROM TIPO_ENDERECO WHERE COD_TIPO_ENDERECO = ? LIMIT 1";

			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, idTipoEndereco);

			ResultSet rs = stmt.executeQuery();
			TipoEndereco tipoEndereco = new TipoEndereco();

			while (rs.next()) {
				tipoEndereco.setCodigoTipoEndereco(rs
						.getLong("COD_TIPO_ENDERECO"));
				tipoEndereco.setDescricaoTipoEndereco(rs
						.getString("DESC_TIPO_ENDERECO"));

			}

			rs.close();
			stmt.close();

			return tipoEndereco;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
